/*
 * main.cpp
 *
 *  Created on: 3/9/2014
 *      Author: anonimo
 */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <time.h>
#include "SDL2/SDL2_gfxPrimitives.h"
#include "SDL2/SDL_image.h"
#include <iostream>
//#include "SDL2/SDL_test_common.h"
#include "vistafiguras.h"
#include "imagenes.h"
#define PATH_SPRITE "/home/anonimo/workspace/git/resources/spritesnow.png"

#define POS_X_CAMINAR 30
#define POS_Y_CAMINAR 10

#define ANCHO_DEFAULT 30
#define ALTO_DEFAULT 30
#define FRAMES_CAMINAR 3

#define FRAMES_SALTAR 5
#define POS_X_SALTAR 120

#define POS_X_STANDBY 0
#define POS_Y_STANDBY 10

#define POS_X_CAYENDO 120
#define POS_Y_CAYENDO 10



//orientacion l = izquierda ; r = derecha;
void drawPersonajeCaminando(SDL_Renderer *renderer,SDL_Texture *texture,const char orientacion, int pos_x,int pos_y,int ancho,int alto){
	//Get ticks te da el tiempo en milisegundo desde el arranque de la ejecucion.
	Uint32 ticks = SDL_GetTicks();
	//con 150 me parece que se ve bien, aumentar para verlo mas lendo o disminuir el parametro para verlo mas rapido.
	Uint32 sprite = (ticks / 150  ) % FRAMES_CAMINAR;
	//defino srcrect posee la info del frame a dibujar
	SDL_Rect srcrect = { POS_X_CAMINAR + (sprite *ANCHO_DEFAULT) ,POS_Y_CAMINAR, ANCHO_DEFAULT, ALTO_DEFAULT };
	SDL_Rect dstrect = { pos_x - (ancho/2), pos_y -( alto/2), ancho, alto};

	switch(orientacion){
		case 'l':{
			SDL_RenderCopy(renderer,texture,&srcrect,&dstrect);
			break;
		}
		case 'r':{
			SDL_Point center = { pos_x , pos_y};
			SDL_RenderCopyEx(renderer,texture,& srcrect,& dstrect,0,&center,SDL_FLIP_HORIZONTAL);
			break;
		}
	}

}

void drawPersonajeSaltando(SDL_Renderer *renderer,SDL_Texture *texture,const char orientacion, int pos_x,int pos_y,int ancho,int alto){
	Uint32 ticks = SDL_GetTicks();
	Uint32 sprite = (ticks / 100 ) % FRAMES_SALTAR;

	SDL_Rect srcrect = { POS_X_SALTAR + (sprite *ANCHO_DEFAULT) ,POS_Y_CAMINAR, ANCHO_DEFAULT, ALTO_DEFAULT };
	SDL_Rect dstrect = { pos_x - (ancho/2), pos_y -( alto/2), ancho , alto};

	switch(orientacion){
		case 'l':{
			SDL_RenderCopy(renderer,texture,&srcrect,&dstrect);
			break;
		}
		case 'r':{
			SDL_Point center = { pos_x , pos_y};
			SDL_RenderCopyEx(renderer,texture,& srcrect,& dstrect,0,&center,SDL_FLIP_HORIZONTAL);
			break;
		}
	}


}

void drawPersonajeStandBy(SDL_Renderer *renderer,SDL_Texture *texture,const char orientacion, int pos_x,int pos_y,int ancho,int alto){

	SDL_Rect srcrect = { POS_X_STANDBY ,POS_Y_STANDBY, ANCHO_DEFAULT, ALTO_DEFAULT };
	SDL_Rect dstrect = { pos_x - (ancho/2), pos_y -( alto/2), ancho , alto};

	switch (orientacion){
	        	case 'l':{
	        		SDL_RenderCopy(renderer,texture,&srcrect,&dstrect);
	           		break;
	        	}
	        	case 'r':{
	        		SDL_Point center = { pos_x , pos_y};
        			SDL_RenderCopyEx(renderer,texture,&srcrect,&dstrect,0,&center,SDL_FLIP_HORIZONTAL);
           			break;
	        	}
	 }
}



void drawPersonajeCayendo(SDL_Renderer *renderer,SDL_Texture *texture,const char orientacion, int pos_x,int pos_y,int ancho,int alto){


	SDL_Rect srcrect = {  POS_X_CAYENDO ,POS_Y_CAYENDO, ANCHO_DEFAULT, ALTO_DEFAULT };
	SDL_Rect dstrect = { pos_x - (ancho/2), pos_y -( alto/2), ancho , alto};

	switch (orientacion){
		        	case 'l':{
		        		SDL_RenderCopy(renderer,texture,&srcrect,&dstrect);
		           		break;
		        	}
		        	case 'r':{
		        		SDL_Point center = { pos_x , pos_y};
	        			SDL_RenderCopyEx(renderer,texture,&srcrect,&dstrect,0,&center,SDL_FLIP_HORIZONTAL);
	           			break;
		        	}
		 }
}



int main(int argc, char ** argv)
{

	    bool quit = false;
	    SDL_Event event;

	    SDL_Init(SDL_INIT_VIDEO);
	    IMG_Init(IMG_INIT_PNG);

	    SDL_Window * window = SDL_CreateWindow("SDL2 Sprite Sheets",
	        SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 640,
	        480, 0);
	    SDL_Renderer * renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC);
	    SDL_Surface * image = IMG_Load("/home/anonimo/workspace/git/resources/spritesnow.png");
	    SDL_Texture * texture = SDL_CreateTextureFromSurface(renderer,
	        image);
	    int pos_x = 500;
	    int pos_y = 100;
	    SDL_SetRenderDrawColor(renderer,255,255, 255, 255);
	    SDL_RenderClear(renderer);
	    int alto=60;
	    int ancho = 60;
	    bool standby = true;
	    char orientacion='l';

	    while (!quit)
	    {

	    	SDL_RenderClear(renderer);

	        SDL_PollEvent(&event);

	        switch (event.type)
	        {
	        case SDL_QUIT:
	            quit = true;
	            break;
	        case SDL_KEYDOWN:
	        	switch(event.key.keysym.sym){


	        		case SDLK_LEFT:
	        			pos_x--;
	        			orientacion ='l';
	        			drawPersonajeCaminando(renderer,texture,'l', pos_x,pos_y,ancho,alto);
	        			standby = false;
	        			break;

	        		case SDLK_RIGHT:
	        			pos_x++;
	        			orientacion ='r';
	        			drawPersonajeCaminando(renderer,texture,'r', pos_x,pos_y,ancho,alto);
	        			standby = false;
	        			break;

	        		case SDLK_DOWN:
	        			pos_y--;
	        			drawPersonajeCayendo(renderer,texture,orientacion, pos_x,pos_y,ancho,alto);
	        			standby = false;
	        			break;

	        		case SDLK_UP:
	        			pos_y++;
	        			drawPersonajeSaltando(renderer,texture,orientacion, pos_x,pos_y,ancho,alto);
	        			standby = false;
	        			break;
	        	}
	        }


	        if(standby){
	        	drawPersonajeStandBy(renderer,texture,orientacion, pos_x,pos_y,ancho,alto);
	        }

	        SDL_RenderPresent(renderer);
	        standby=true;
	    }

	    SDL_DestroyTexture(texture);
	    SDL_FreeSurface(image);
	    SDL_DestroyRenderer(renderer);
	    SDL_DestroyWindow(window);
	    IMG_Quit();
	    SDL_Quit();

	    return 0;
}

